BTC
$96,000
5.73%
ETH
$3,521.91
3.97%
HTX
$0.{5}2273
5.23%
SOL
$198.17
3.05%
BNB
$710
3.05%
lang
简体中文
繁體中文
English
Tiếng Việt
한국어
日本語
ภาษาไทย
Türkçe
Trang chủ
AI AI
Tin nhanh
Bài viết
Sự kiện
BlockBeats Pro
Thêm
Thông tin tài chính
Chuyên đề
Hệ sinh thái chuỗi khối
Mục nhập
Podcast
Data
OPRR
Partnered With:

Rust là gì và dự án blockchain nổi tiếng nào được phát triển bằng Rust?

Đọc bài viết này mất 39 phút
Các dự án như Parity, Polkadot, Grin, Nervos, v.v. có điểm gì chung? Tất cả đều được phát triển bằng ngôn ngữ Rust.

Tiêu đề gốc: "Rust hôm nay đã được 4 tuổi. Tại sao ngày càng có nhiều dự án nổi tiếng được phát triển ở Rust? 》
Nguồn gốc: Blockchain Base Tác giả: Mike Tang


Hôm nay 4 năm trước (15 tháng 5 năm 2015 ), chương trình Rust Nhóm nòng cốt ngôn ngữ chính thức công bố phát hành phiên bản Rust 1.0.

Trong 4 năm qua, khả năng giải quyết các vấn đề về hệ thống có tính tương tranh cao và độ bảo mật cao của nó ngày càng được ưa chuộng nhà phát triển. Và trong 4 năm liên tiếp, nó đã giành vị trí đầu tiên trong cuộc bình chọn “Ngôn ngữ lập trình được yêu thích nhất” trong số các nhà phát triển Stack Overflow.


640?wx_fmt=png

Gần đây ngày càng có nhiều dự án blockchain nổi tiếng chọn sử dụng Rust làm ngôn ngữ phát triển, bao gồm: Parity, Polkadot, Substrate , Grin, Ethereum Classic, Holochain, Cardano-Rust, Exonum, Lighthouse, Nimiq, Nervos, Conflux-Rust, Codechain, Witnet và nhiều dự án nổi tiếng khác.

Bài viết này cố gắng khám phá những lý do đằng sau sự xuất hiện của xu hướng này. Và giải thích một cách có hệ thống về tác động của ngôn ngữ Rust đối với sự phát triển blockchain và những lợi thế của nó.

Rust: Một hệ thống phần mềm an toàn và đồng thời

Rust là ngôn ngữ lập trình cấp hệ thống được thiết kế để đảm bảo an toàn cho bộ nhớ và luồng cũng như ngăn ngừa lỗi phân tách.

Là ngôn ngữ lập trình cấp hệ thống, khái niệm cơ bản của nó là "sự trừu tượng hóa không chi phí". Về mặt lý thuyết, nó nhanh như C/C++. Rust có thể được phân loại là ngôn ngữ lập trình được biên dịch, đa mô hình, có mục đích chung, tương tự như C/C++.

Không giống như hai ngôn ngữ lập trình này, Rust an toàn theo luồng! Mục tiêu của nó là tạo ra một hệ thống phần mềm an toàn và đồng thời. Rust nhấn mạnh đến tính an toàn, đồng thời và kiểm soát bộ nhớ. Mặc dù Rust mượn cú pháp từ C/C++, nhưng nó loại bỏ các con trỏ null và con trỏ lơ lửng, vốn là nguyên nhân gây ra sự cố hệ thống, rò rỉ bộ nhớ và mã không an toàn trong C/C++.

Mặc dù Rust là ngôn ngữ lập trình cấp hệ thống nhưng điều đó không có nghĩa là nó chỉ có thể viết các chương trình cấp thấp (hệ điều hành, driver, Công cụ, cơ sở dữ liệu, công cụ tìm kiếm, v.v.), mức độ trừu tượng cao của nó là hoàn toàn đáng kinh ngạc. Thực tiễn đã chứng minh rằng khả năng và sự thuận tiện trong mô hình hóa vấn đề của nó không thua kém gì C++/Java/Python/Ruby.

Nhưng những ngôn ngữ có tính trừu tượng cực cao như Haskell không phải là hướng phát triển của Rust. Rust cố gắng tìm sự cân bằng giữa sự trừu tượng và thế giới thực.

Hiện tại, Rust đã giành vị trí đầu tiên là "Ngôn ngữ yêu thích của lập trình viên" trong 4 năm liên tiếp trong cuộc bình chọn ngôn ngữ hàng năm của StackOverflow.

Lịch sử ngôn ngữ Rust

Rust ban đầu là một dự án cá nhân của nhân viên Mozilla Graydon Hoare. Nó bắt đầu vào năm 2009 và nhận được sự hỗ trợ từ Viện Nghiên cứu Mozilla. Dự án được công bố ra công chúng vào năm 2010.

Bootstrapping được triển khai từ năm 2010 đến năm 2011. Kể từ đó, Rust đã trải qua những thay đổi và lặp lại rất lớn về thiết kế (một hành trình vô cùng gian khổ), và cuối cùng phiên bản 1.0 đã được phát hành vào ngày 15 tháng 5 năm 2015.

Trong quá trình nghiên cứu và phát triển này, Rust đã thiết lập một cộng đồng mạnh mẽ và năng động, đồng thời hình thành một cơ chế đóng góp dự án hoàn chỉnh và ổn định (đây là thực sự đáng sợ). Rust hiện được duy trì bởi cộng đồng nhà phát triển Rust Project.

Hình sau mô tả bản đồ di truyền của Rust:


640?wx_fmt=png

Rust vẫn là một ngôn ngữ thích hợp

Rust đã đi được một chặng đường dài kể từ phiên bản 1.0 đến nay (tháng 5 năm 2019). Nhưng nhìn chung, so với Python, C, C++, v.v., Rust không được sử dụng rộng rãi (rốt cuộc thì nó còn quá non trẻ).

Cuộc khảo sát cho thấy phần lớn lý do khiến tỷ lệ sử dụng Rust thấp là do một số ít công ty chọn Rust.


640?wx_fmt=png

Tuy nhiên, Rust chiếm tỷ trọng ngày càng tăng trong công việc. Rust đã chứng kiến sự tăng trưởng đáng kinh ngạc trong các ứng dụng thương mại trong năm qua. Bao gồm một số công ty quen thuộc:

Amazon: Xây dựng công cụ bằng Rust;

Facebook: công cụ kiểm soát mã nguồn;

Google: là một phần của dự án Fuchsia;

Google: là một phần của dự án Fuchsia; span>

Microsoft: Sử dụng một phần Rust trong khuôn khổ Azure IoT mới;

Twitter: Sử dụng Rust như một phần của hoạt động hỗ trợ xây dựng nhóm.

Baidu trong nước và Alibaba cũng đã sử dụng Rust ở quy mô nhỏ trong nội bộ. Tôi tin rằng khi càng nhiều công ty chọn Rust, Rust thậm chí sẽ còn phát triển nhanh hơn nữa.

Gavin Wood đưa Rust vào blockchain

Người đầu tiên áp dụng Rust vào một dự án blockchain nổi tiếng phải là Gavin Wood nổi tiếng. Tiến sĩ Gavin Wood rời cộng đồng Ethereum vào nửa cuối năm 2015, thành lập Parity Technologies, ra mắt ứng dụng khách Ethereum Parity và chiếm thành công một nửa cộng đồng Ethereum. Ứng dụng khách Parity này được viết bằng Rust.


640?wx_fmt=png

Thật ra dự án MaidSafe đã xuất hiện trước khi Parity xuất hiện. MaidSafe thử rất nhiều thứ với ngôn ngữ Rust. Tính bảo mật được nhấn mạnh bởi chính ngôn ngữ Rust và các dự án tiên tiến như MaidSafe có thể đã cho Gavin đủ lý do để chọn Rust làm ngôn ngữ phát triển chẵn lẻ.


640?wx_fmt=png

Các tính năng ngôn ngữ riêng của Rust (bảo mật, hiệu suất cao, lập trình đồng thời) và các tính năng blockchain (phân phối, mã hóa, bảo mật nhạy cảm) vốn có có sự chồng chéo đáng kể.

Không chỉ vậy, Rust khác biệt về mặt ngôn ngữ lập trình, không phải vì cú pháp của nó đẹp như thế nào (trên thực tế, một số người thậm chí còn nghĩ nó hơi xấu) Hoặc cộng đồng nổi tiếng đến mức nào, nhưng vì sự tự tin mà bạn có được khi viết mã trong đó.

Có vẻ như Rust sẽ ảnh hưởng đến hiệu quả và tính biểu cảm trong quá trình viết mã của bạn, nhưng đáng ngạc nhiên là kết luận lại hoàn toàn ngược lại: Còn rất nhiều dễ dàng viết một chương trình Rust hiệu quả, thành ngữ hơn là một chương trình nguy hiểm tiềm tàng.

Sau đây là các lỗi được phát hiện trong nhân Linux từ tháng 1 đến tháng 4 năm 2018:


640?wx_fmt=png

Đối với Rust, phần 51% ở phía bên phải của hình trên có thể tránh được ở cấp độ ngôn ngữ. Nói cách khác, đối với Rust, những vấn đề ở phía bên phải của bức tranh trên hoàn toàn không tồn tại.

Hiện đang có 2 quan điểm: "Chỉ cần biết viết C" và "Chỉ cần để ở mức thấp nhất những điều dành cho Chuyên gia", cả hai quan điểm đều không đủ. Nhân Linux được viết bởi những lập trình viên giỏi nhất, có thể là 5% lập trình viên hàng đầu trong ngành, nhưng CVE vẫn xuất hiện hàng năm.

Bạn có thể nghĩ rằng 50 lỗi trong hàng triệu dòng mã chẳng là gì cả. Nhưng trong một số lĩnh vực quan trọng, lỗi có nghĩa là rủi ro mang tính hệ thống (ví dụ, lỗi trong máy điều hòa nhịp tim có thể dẫn đến hậu quả đe dọa tính mạng). Hơn nữa, 50 lỗi này là những gì chúng tôi đã tìm thấy, ai biết chúng tôi còn chưa tìm ra được bao nhiêu lỗi? Với Rust, chúng tôi biết trước câu trả lời.

Điều tuyệt vời là Rust đạt được sự an toàn về bộ nhớ và an toàn chạy đồng thời mà không làm giảm hiệu suất. Điều tuyệt vời hơn nữa là nó thậm chí còn sử dụng cùng một bộ trừu tượng để giải quyết các vấn đề trong hai lĩnh vực khác nhau: an toàn bộ nhớ và cạnh tranh dữ liệu.

Tính trừu tượng không tốn chi phí của Rust cho phép bạn tận hưởng tính bảo mật mà không phải hy sinh hiệu suất. Đây là điều mà các lập trình viên truyền thống mơ ước.

Lấy Parity làm ví dụ. Parity sử dụng Rust một cách chính xác vì bạn không cần phải lo lắng khi viết mã phức tạp và hiệu suất cao trong Rust . Viết chương trình bằng Rust và tránh các hành vi không xác định, chạy đua dữ liệu và các vấn đề về an toàn bộ nhớ. Chưa kể, Rust rất nhanh, viết thú vị, dễ đọc và hầu như không có thời gian chạy.

Các vấn đề về an toàn bộ nhớ rất khó khăn vì bạn không thể dễ dàng viết các bài kiểm tra để nắm bắt chúng. Nếu bạn không phát hiện ra lỗi trước giai đoạn beta, lỗi đó có thể tồn tại trong mã trong nhiều năm, giống như một quả bom hẹn giờ đang đếm ngược từng giây. Tất nhiên, cũng có những công cụ như Valgrind để giúp bạn bắt những lỗi này. Nhưng nếu vấn đề về bộ nhớ không được kích hoạt trong quá trình thực thi hoặc mã do các công cụ đó tạo ra không được thực thi trong thời gian chạy thì chúng không thể bắt được.

Vì vậy, bằng cách sử dụng Rust, chúng tôi loại bỏ một lượng lớn các lỗi phức tạp và khó đoán nhất.

Rust có lý thuyết chứng minh chính thức được nhúng trong đó, nhưng nó bị giới hạn ở vấn đề an toàn bộ nhớ và tính đồng thời. Rust sử dụng logic nội bộ để chứng minh rằng chương trình của bạn là chính xác. Đây là lý do tại sao bạn cảm thấy rất tự tin khi viết mã Rust. Mỗi khi bạn biên soạn, sẽ có một bộ lý thuyết toán học cung cấp dịch vụ chứng minh cho bạn.

Trong một thời gian dài, một trong những đặc điểm nổi bật của các ngôn ngữ lập trình hàm như Haskell là nó tương đối dễ thực hiện. bằng chứng, điều này là không thể với các ngôn ngữ lập trình mệnh lệnh truyền thống (vì khả năng biến đổi chung, số học con trỏ không an toàn và các tác dụng phụ không thể kiểm soát).

Nhưng sự xuất hiện của Rust đã thay đổi tình hình này. Là một ngôn ngữ mệnh lệnh, nó đang trên đường được chứng minh. Cho đến nay, một số phần của thư viện chuẩn đã được chứng minh là đúng.


640?wx_fmt=png

Những dự án blockchain nổi tiếng được phát triển cùng với Rust

parity

Nói về các dự án blockchain nổi tiếng được viết bằng Rust, Parity Chịu gánh nặng . Parity là một ứng dụng khách nút Ethereum chẵn lẻ-ethereum.


640?wx_fmt=png

Parity Technologies là tên công ty của họ. Parity hiện bao gồm một nhóm ứng dụng khách và nhiều thư viện khác nhau, bao gồm:

parity-ethereum;

chẵn lẻ-zcash;

chẵn lẻ-bitcoin; span>

shasper.

Nói cách khác, Parity Technologies cung cấp "nhóm gia đình" để phát triển chuỗi khối bằng Rust.

polkadot/chất nền

Polkadot là một sáng kiến do Web3 Foundation khởi xướng và được Parity Technologies phát triển, với mục đích nhưng không giới hạn ở việc kết nối các chuỗi khối.

Polkadot cho phép các nhà phát triển và doanh nghiệp sử dụng giao thức của mình để xây dựng các chuỗi khối, được gọi là parachains. Miễn là các parachain này được xây dựng trên Polkadot, chúng sẽ có chung sự đồng thuận Bằng chứng về quyền lực (PoA).

Vì loại đồng thuận này được nhúng trong Polkadot nên các nhà phát triển parachain có thể tập trung vào các đặc điểm cụ thể của chuỗi khối tương ứng của họ. Tất cả các parachain được kết nối liền mạch với một blockchain chung gọi là chuỗi chuyển tiếp, chuỗi này đóng vai trò kết nối tất cả các parachain.

Dự án Polkadot do Gavin Wood lãnh đạo. Trên thực tế, dự án này thuộc cùng một công ty với nhóm parity family ở trên, nhưng nó được làm việc bởi một nhóm khác. .

Nếu theo dõi tiến trình của Polkadot trong thời gian thực, bạn có thể thường thấy từ "Substrate". Đây là một phần quan trọng của dự án Polkadot. Chất nền chẵn lẻ là một dự án riêng biệt với Polkadot. Polkadot dựa trên Substrate và các dự án khác dựa trên Substrate cũng có thể chạy trên mạng Polkadot (tạo thành một hệ sinh thái).

Vậy Chất nền là gì? Bạn có thể coi nó như một khung tương tự như Express hoặc các ứng dụng web khác, nhưng đó là một khung để xây dựng các hệ thống phân tán hoặc phi tập trung, chẳng hạn như các dự án tiền điện tử hoặc hệ thống bus tin nhắn.

Giống như hầu hết các ứng dụng web không cần triển khai lại giao thức HTTP của riêng mình và mỗi nhóm cũng không cần phải triển khai giao thức này để tạo một chuỗi mới. Mã cho mạng và sự đồng thuận cần phải được triển khai từ đầu, điều này gây lãng phí công sức.

Chưa kể rằng để triển khai logic nghiệp vụ, các nhà mật mã học, nhà nghiên cứu bảo mật, kỹ sư mạng, nhà phát triển phải được thuê (để phối hợp cập nhật) Đợi đã. Nếu sử dụng Substrate để xây dựng một dự án mới, bạn chỉ cần triển khai một số lệnh gọi lại hàm trong mã của mình để tạo chuỗi một cách nhanh chóng và dễ dàng.

*Liên kết tham khảo:

https://github.com/paritytech/polkadot
https:/ /github.com/paritytech/substrate


nụ cười

grin là một người nổi tiếng nhỏ trên Internet trong ngành công nghiệp blockchain ngày nay. Một trong số ít dự án hướng tới mục tiêu trở thành tiền tệ thực sự.

Grin cam kết cung cấp một loại tiền điện tử riêng tư, có thể mở rộng với kế hoạch phát hành vào đầu năm 2019. Nó có một số thuộc tính độc đáo: nó sử dụng định dạng chuỗi khối bảo vệ quyền riêng tư được gọi là MimbleWimble; chỉ lưu trữ một lượng nhỏ dữ liệu trong chuỗi khối và việc chạy một nút đầy đủ rất rẻ và dễ dàng.

Mimblewimble được phát triển bởi những người ẩn danh, với các nhóm phân bổ trên khắp thế giới; nó không có bất kỳ cơ chế PoW được khai thác trước nào, khiến nó trở thành bình đẳng và phi tập trung hơn.


640?wx_fmt=png

Nhà phát triển cốt lõi của Grin và thành viên Hội đồng Grin D

Sự xuất hiện của Grin báo trước sự trở lại của Bitcoin Sự xuất hiện có lẽ là hướng đi đúng đắn cho loại dự án này.

Thật vui khi được tham gia vào quá trình phát triển và truyền bá rượu gin.

holochain

Holochain cam kết giải quyết vấn đề triển khai Dapp, tức là xây dựng mạng lưu trữ đám mây.

Trong khi mọi người đang nghiên cứu cách cải thiện hiệu suất của blockchain thì Holochain đang chế tạo ô tô. Đôi khi suy nghĩ cứng nhắc không phải là điều tốt. Thay đổi cách suy nghĩ có thể giúp bạn tìm ra những cách mới để giải quyết vấn đề. Giống như dòng chữ trên trang web chính thức của Holochain: Hãy suy nghĩ bên ngoài các khối.

Holochain là một dự án rất thú vị, nó không phải là một blockchain theo nghĩa hẹp. Những người nghiên cứu blockchain về cơ bản đang nghiên cứu cách hoàn thành việc truyền tải giá trị bằng cách giải quyết các vấn đề về niềm tin, từ đó hoàn thành những thay đổi trong quan hệ sản xuất.

Để đạt được mục tiêu cuối cùng, chúng tôi không nhất thiết phải giới hạn tầm nhìn của mình ở một công nghệ cụ thể. Cho dù đó là blockchain, DAG hay Holochain, miễn là nó có thể đạt được mục tiêu cuối cùng của chúng tôi thì nó có thể được coi là một công nghệ tốt.

Để đảm bảo tính nhất quán của thông tin trong chuỗi khối, mỗi nút trong hệ thống là một sổ cái riêng biệt và các sổ cái này ghi lại thông tin giống nhau . Mặc dù blockchain, một công nghệ sổ cái phân tán, đáp ứng tính nhất quán nhưng nó tạo ra sự dư thừa thông tin rất lớn.

Holochain tin rằng sự đồng thuận có thể khác nhau và không nhất thiết phải đạt được sự đồng thuận trong tất cả các sự kiện. Do đó, nó giải quyết vấn đề đồng thuận một cách sáng tạo từ một góc độ khác. Holochain chia sổ cái thành nhiều phần và giao chúng cho từng nút tham gia, đồng thời đảm bảo tính nhất quán giữa các sổ cái thông qua công nghệ DHT và công nghệ mật mã.

Nói một cách đơn giản, chúng ta có thể hiểu chức năng của DHT như hình ảnh trên mảnh ghép. Chúng ta có thể đánh giá xem mảnh ghép đó đã hoàn chỉnh hay chưa thông qua hình ảnh. .

Các nút không còn cần phải đồng bộ hóa các bản ghi trong nhiều sổ cái nữa. Chúng chỉ cần ghi lại nội dung liên quan đến chính chúng để đạt được sự đồng thuận trên toàn bộ mạng. Đây là Holochain. của sự đổi mới.

thần kinh

Đầu tiên, Nervos làm gì? Theo trang web chính thức, Nervos sẽ: xây dựng cơ sở hạ tầng nhiều lớp cho nền kinh tế mã hóa trong tương lai. Cách tiếp cận theo lớp cũng là thiết kế hệ thống chủ đạo của blockchain hiện tại. Lớp 1 phát hành tài sản gốc, hỗ trợ tính bảo mật cao và tính phân cấp cao cũng như hy sinh hiệu quả.

Lớp 2 thực hiện việc mở rộng. Khi đó Nervos CKB, với tư cách là Lớp 1 của hệ thống, có hai mục đích chính sau: lưu trữ tài sản và nâng cao giao thức (bảo mật và phân cấp).

Lưu ý rằng đây cũng là nguyên tắc thiết kế hệ thống kinh tế Nervos CKB, tức là lưu trữ tài sản lớn hơn trao đổi giá trị .

Nervos có một số điểm nổi bật về thiết kế thú vị:

Giải quyết vấn đề giảm phát và lạm phát;

Giải quyết vấn đề xử lý phí Một trong những khái niệm của Nervos CKB là nền tảng hợp đồng thông minh Ngoài mã thông báo gốc, giá trị cũng phải bao gồm giá trị của các tài sản tiền điện tử khác được phát hành trên nền tảng;

Giải quyết vấn đề giá cả tài nguyên;

Giải quyết vấn đề phát hiện và điều chỉnh lãi suất.

exonum

Sản xuất bởi Bitbury. Nó là một khung phát triển chuỗi quyền được phát triển bằng Rust. Sử dụng exonum, bạn có thể dễ dàng xây dựng chuỗi liên minh.

Kết luận

Là ngôn ngữ chỉ mới 4 tuổi (hôm nay, ngày 15 tháng 5 năm 2019, là kỷ niệm 4 năm ngày phát hành chính thức ngôn ngữ Rust), ngôn ngữ Rust đang phát triển nhanh chóng trong nhiều lĩnh vực khác nhau của ngành CNTT và do đó đối với các đặc điểm của chính blockchain, lĩnh vực chuỗi khối là một trong những lĩnh vực đầu tiên áp dụng Rust.

Trong lĩnh vực blockchain, Rust đang chiếm lĩnh thị trường dự án blockchain mới nổi với đà tăng trưởng vượt trội, nhiều dự án cũ nổi tiếng cũng đang cân nhắc chuyển đi để viết lại Rust.

Đồng thời, các kết quả do sự phát triển nhanh chóng của công nghệ WebAssembly mang lại cũng đã được ứng dụng vào blockchain một cách kịp thời . Rust cung cấp hỗ trợ hạng nhất cho WebAssugging. Có lẽ là ngôn ngữ tốt nhất cho đến nay. Để biết chi tiết, vui lòng tham khảo:

https://rustforce.net/article?id=6807cc27-0e6c-4bc9-baa3-8b0c68ae9529

Tôi tin rằng khi tính năng async/await của ngôn ngữ Rust trở nên ổn định trong năm nay, việc sử dụng Rust để phát triển blockchain sẽ trở nên dễ dàng và thuận tiện hơn. Sẽ ngày càng có nhiều dự án blockchain chọn sử dụng Rust làm ngôn ngữ phát triển đầu tiên của họ và chúng tôi sẽ mở ra một làn sóng đỉnh cao của việc học ngôn ngữ Rust.

Tôi muốn dùng bài viết này như một món quà sinh nhật nhân dịp kỷ niệm 4 năm thành lập Rust. Tôi chúc Rust một sinh nhật vui vẻ!

*Giới thiệu về tác giả:

Mike Tang là một lập trình viên cấp cao và là người đam mê ngôn ngữ Rust, anh đã làm quen với Rust từ nửa cuối năm 2014 và là tác giả chính của Sapper Web framework. Anh ấy đã tập trung vào việc học và nghiên cứu trong lĩnh vực blockchain từ năm 2018 và đã tham gia đóng góp cho cita, Rust-libp2p, Grin và các dự án khác.

Tài liệu tham khảo:

https://rustforce.net.cn/section?id=17dd744e-429a-42b1-8d30-01d31d556ab0
https://www.jianshu.com/p/cca7e4f46b86
https://www.parity.io/why-rust/

Liên kết gốc: mp.weixin.qq.com




Chào mừng bạn tham gia cộng đồng chính thức của BlockBeats:

Nhóm Telegram đăng ký: https://t.me/theblockbeats

Nhóm Telegram thảo luận: https://t.me/BlockBeats_App

Tài khoản Twitter chính thức: https://twitter.com/BlockBeatsAsia

Chọn thư viện
Thêm mới thư viện
Hủy
Hoàn thành
Thêm mới thư viện
Chỉ mình tôi có thể nhìn thấy
Công khai
Lưu
Báo lỗi/Báo cáo
Gửi